package main

/*
1.需要监听
2.需要实例化gRPC服务端
3.在gRPC上注册微服务
4.启动服务端
*/

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"net"
	pb "src/gRPC/proto"
	"time"
)

//定义空接口
type UserInfoService struct {
	pb.UnimplementedUserInfoServiceServer //类 实现了下面的接口 UserInfoServiceServer
	//pb.UserInfoServiceServer //接口
}

//因为下面的 pb.RegisterUserInfoServiceServer(s, &UserInfoService{}) 第二个参数类型需要为 UserInfoServiceServer接口类型的
//如果上面2个都不继承，和视频教程一样写空接口（视频教程可能api比较老，接口里面没有这个must开头的方法），尝试手动全部完成（即实现某接口）
//尝试给自定义的结构体 UserInfoService 补充一下这个方法，发现下面还是报错。

/*
Cannot use '&UserInfoService{}' (type *UserInfoService) as the type UserInfoServiceServer Type cannot implement 'UserInfoServiceServer' as it has a non-exported method and is defined in a different packag
大概意思就是非公开的方法(首字母小写开头，不是公开的)无法在外部包完成实现，所以这种方式不行。

只能通过上面继承接口类 UserInfoServiceServer 或者 继承实现类 UnimplementedUserInfoServiceServer (用实现类最好，毕竟命名都写成了这样，就是让用户继承它来覆盖的)
*/
//func (s *UserInfoService) mustEmbedUnimplementedUserInfoServiceServer() {}

//实现方法
func (s *UserInfoService) GetUserInfo(c context.Context, req *pb.UserRequest) (resp *pb.UserResponse, err error) {

	//获取参数
	var name = req.Name

	//@todo test client req timeout
	time.Sleep(time.Second * 2)

	//判断返回
	if name == "zs" {
		resp = &pb.UserResponse{
			Id:     1,
			Name:   "chenlong",
			Gender: 2,
			Hobby:  []string{"run", "sing"},

			Status: pb.StatusEnum_StatusOk,
			Phone:  &pb.PhoneInfo{Num: 1, Name: "iphone 8 plus"},
		}
	}

	return
}

func main() {

	//1.监听端口
	var addr = "127.0.0.1:9099"
	var listen, err = net.Listen("tcp", addr)
	if err != nil {
		fmt.Println("listen error")
	}

	defer listen.Close()

	fmt.Println("listen addr:", addr)

	//2.实例化grpc
	s := grpc.NewServer()

	//3.在gRPC上注册微服务
	u := &UserInfoService{}
	pb.RegisterUserInfoServiceServer(s, u)

	//4.启动服务端
	s.Serve(listen)
}
